#!/bin/sh /etc/rc.common
# Copyright (C) 2010 Openwrt.org

START=60

USE_PROCD=1

ZNC_CONFIG_PATH=/tmp/etc/znc
PID_FILE=${ZNC_CONFIG_PATH}/znc.pid
ZNC_CONFIG=${ZNC_CONFIG_PATH}/configs/znc.conf

EXTERNAL_CONFIG=0
DISABLED=

RUNAS_USER=
RUNAS_GROUP=

add_param() {
	echo "$1 = $2" >> $ZNC_CONFIG
}

add_chan() {
	chan=${1% *}
	pass=${1#* }
	echo "		<Chan $chan>" >> $ZNC_CONFIG
	[ "$chan" != "$pass" ] && echo "			Key = $pass" >> $ZNC_CONFIG
	echo "		</Chan>" >> $ZNC_CONFIG
}

add_network() {
	local current_user="$1"
	local network="$2"
	local user
	local name

	config_get user "$network" user

	[ "$user" = "$current_user" ] || return 0

	config_get name "$network" name
	echo "	<Network $name>" >> $ZNC_CONFIG
	config_list_foreach "$network" server "add_param \"		Server\""
	config_list_foreach "$network" fingerprint "add_param \"		trustedserverfingerprint\""
	config_list_foreach "$network" channel "add_chan"
	echo "	</Network>" >> $ZNC_CONFIG
}

znc_global() {
	local znc="$1"
	local anoniplimit
	local maxbuffersize
	local connectdelay
	local serverthrottle
	local znc_config_path
	local znc_pem_file

	config_get_bool DISABLED "$znc" disabled 0

	[ "$DISABLED" -eq 0 ] || return 0

	config_get znc_config_path "$znc" znc_config_path

	config_get RUNAS_USER "$znc" runas_user znc
	config_get RUNAS_GROUP "$znc" runas_group znc

	if [ "${znc_config_path}" ]
	then
		ZNC_CONFIG_PATH=$znc_config_path
		EXTERNAL_CONFIG=1
	else
		mkdir -p $ZNC_CONFIG_PATH/configs/
		[ ! -f "$ZNC_CONFIG" ] || rm "$ZNC_CONFIG"

		add_param "Version" "1.6"

		config_get anoniplimit "$znc" anoniplimit
		config_get maxbuffersize "$znc" maxbuffersize
		config_get connectdelay "$znc" connectdelay
		config_get serverthrottle "$znc" serverthrottle
		config_get znc_pem_file "$znc" znc_ssl_cert

		[ -z "$znc_pem_file" ] || ln -sf "$znc_pem_file" $ZNC_CONFIG_PATH/znc.pem

		[ -z $anoniplimit ] || echo "AnonIPLimit = $anoniplimit" >> $ZNC_CONFIG
		[ -z $maxbuffersize ] || echo "MaxBufferSize = $maxbuffersize" >> $ZNC_CONFIG
		[ -z $connectdelay ] || echo "ConnectDelay = $connectdelay" >> $ZNC_CONFIG
		[ -z $serverthrottle ] || echo "ServerThrottle = $anoniplimit" >> $ZNC_CONFIG

		echo "PidFile = $PID_FILE" >> $ZNC_CONFIG

		config_list_foreach "$znc" listener "add_param Listener"
		config_list_foreach "$znc" module "add_param LoadModule"
	fi
}

add_listener() {
       local listener="$1"
       local host
       local port
       local allowirc
       local allowweb
       local ipv4
       local ipv6
       local ssl

       config_get host "$listener" host
       config_get port "$listener" port
       config_get allowirc "$listener" allowirc
       config_get allowweb "$listener" allowweb
       config_get ipv4 "$listener" ipv4
       config_get ipv6 "$listener" ipv6
       config_get ssl "$listener" ssl

       echo "<Listener $listener>" >> $ZNC_CONFIG

       [ -z "$host" ] || add_param "  Host" "$host"
       [ -z "$port" ] || add_param "  Port" "$port"
       [ -z "$allowirc" ] || add_param "  AllowIRC" "$allowirc"
       [ -z "$allowweb" ] || add_param "  AllowWeb" "$allowweb"
       [ -z "$ipv4" ] || add_param "  IPv4" "$ipv4"
       [ -z "$ipv6" ] || add_param "  IPv6" "$ipv6"
       [ -z "$ssl" ] || add_param "  SSL" "$ssl"

       echo "</Listener>" >> $ZNC_CONFIG
}

add_user() {
	local user="$1"
	local password
	local nick
	local altnick
	local ident
	local realname
	local buffer
	local quitmsg
	local chanmodes
	local vhost
	local server

	config_get password "$user" password
	config_get nick "$user" nick
	config_get altnick "$user" altnick
	config_get ident "$user" ident
	config_get realname "$user" realname
	config_get buffer "$user" buffer
	config_get quitmsg "$user" quitmsg
	config_get chanmodes "$user" chanmodes
	config_get vhost "$user" vhost
	config_get server "$user" server

	echo "<User $user>" >> $ZNC_CONFIG

	case "$password" in
	"md5#"* | "sha256#"* | "plain#"*)
		add_param "	Pass" "$password"
		;;
	*)
		add_param "	Pass" "plain#$password"
		;;
	esac

	add_param "	Nick" "$nick"
	add_param "	AltNick" "${altnick:-$nick"_"}"
	add_param "	Ident" "${ident:-$nick}"
	add_param "	RealName" "${realname:-$nick}"
	[ -z "$vhost" ] || add_param "	VHost" "$vhost"
	add_param "	Buffer" "${buffer:-50}"
	add_param "	KeepBuffer" "false"
	add_param "	ChanModes" "${chanmodes:-"+stn"}"
	[ -z "$quitmsg" ] || add_param "	QuitMsg" "$quitmsg"

	config_list_foreach "$user" module "add_param \"	LoadModule\""

	# add legacy network
	if [ "$server" ]; then
		echo "	<Network Default>" >> $ZNC_CONFIG
		config_list_foreach "$user" server "add_param \"		Server\""
		config_list_foreach "$user" fingerprint "add_param \"		trustedserverfingerprint\""
		config_list_foreach "$user" channel "add_chan"
		echo "	</Network>" >> $ZNC_CONFIG
	fi

	config_foreach "add_network \"$user\"" network

	echo "</User>" >> $ZNC_CONFIG
}

start_service() {
	config_load znc
	config_foreach znc_global znc

	[ "$DISABLED" -eq 0 ] || return 0

	if [ "$EXTERNAL_CONFIG" -eq 0 ]
	then
		config_foreach add_listener listener
		config_foreach add_user user

	fi

	chown -hR ${RUNAS_USER}:${RUNAS_GROUP} ${ZNC_CONFIG_PATH} || {
		logger -s -t ZNC -p daemon.err "Invalid UID/GID. Aborting startup"
		exit 1
	}

	procd_open_instance
	procd_set_param file /etc/config/znc
	[ "$EXTERNAL_CONFIG" -eq 1 ] && procd_set_param file "${ZNC_CONFIG}/configs/znc.conf"
	procd_set_param command /usr/bin/znc
	procd_append_param command -f -d$ZNC_CONFIG_PATH
	procd_set_param user ${RUNAS_USER}
	procd_set_param respawn
	procd_close_instance
}
